/*
 * CS_CHECK_VALIDATE_DATA.cpp
 *
 *  Created on: 2013. 10. 30.
 *      Author: jjaehuny
 */



#include "../../Command.h"

#include "../../User.h"
#include "../../NLogic/Space.h"

#include "../../NResource/Static.h"
#include "../../NResource/ValidResource.h"

#include "../../GameLog.h"

namespace ProjectZ { namespace NCommand {

void send_SC_CHECK_VALIDATE_DATA(User * pUser, int16_t ack)
{
	if (ack != ACK_OK)
	{
		// DB LOG 기록...
	}

	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
	* pAck << ack;
	pAck->MakePacket(CMD_SC_CHECK_VALIDATE_DATA);
	pUser->Send(pAck);
}

void Command::CS_CHECK_VALIDATE_DATA(User * pUser, ::Network::Packet * pPacket)
{
	/*
	 * /// 유효성 검증 데이터
	CS_CHECK_VALIDATE_DATA				0x094E
	{
		u32 u32sp;
		u32 u32attack;
		u32 u32defence;
		u32 u32str;
		u32 u32dex;
		u32 u32con;
		u32 u32int;
		u32 u32avoid_rate;
		u32 u32critical_rate;
		u32 u32critical_damage;
	}
	SC_CHECK_VALIDATE_DATA				0x094F
	{
		s16 s16ack;
	}
	 */

	PREPARE_PACKET;

	int32_t u32sp;
	int32_t u32attack;
	int32_t u32defence;
	int32_t u32str;
	int32_t u32dex;
	int32_t u32con;
	int32_t u32int;

	int32_t u32avoid_rate;
	int32_t u32critical_rate;
	int32_t u32critical_damage;

	NResource::ValidResource::Flyweight * pFly = NResource::Static::Instance().GetValid()->GetFly(pUser->GetCharacterInfo().level);
	if (NULL == pFly)
	{
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	* pPacket >> u32sp >> u32attack >> u32defence >> u32str >> u32dex >> u32con >> u32int
				>> u32avoid_rate >> u32critical_rate >> u32critical_damage;

	if (u32sp > pFly->_SP)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32attack > pFly->_ATT)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32defence > pFly->_DEF)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32str > pFly->_STR)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32dex > pFly->_DEX)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32con > pFly->_CON)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32int > pFly->_INT)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32avoid_rate > pFly->_AVOID_RATE)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32critical_rate > pFly->_CRITICAL_RATE)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	if (u32critical_damage > pFly->_CRITICAL_DAMAGE)
	{
		::ProjectZ::NGameLog::Fail_ValidateData(pUser, u32sp ,u32attack ,u32defence ,u32str ,u32dex ,u32con ,u32int ,u32avoid_rate ,u32critical_rate ,u32critical_damage);
		send_SC_CHECK_VALIDATE_DATA(pUser, ACK_CHECK_INVALID_FAIL);
		return;
	}

	send_SC_CHECK_VALIDATE_DATA(pUser, ACK_OK);
}

} /*NCommand*/ } /*ProjectZ*/
